/*
    指针：是一个变量，它的值是另一个变量在内存中的地址。
    引用：是另一个变量的别名。
*/

// ================基础概念

void fun1()
{
    int a = 10;
    int *ptr = &a; // ptr是a的指针
    int &ref = a;  // ref是a的引用
}

// ================指针的运算

//  * 解引用运算符：用于解引用指针，获取指针所指向的内存地址中的值。
//  & 取地址运算符：用于获取变量的地址。
//  -> 成员指针运算符：用于访问指针所指向的对象的成员。
// 指针运算 ，指针可以+-等运算，是地址上的偏移。

// ================多级指针

void fun2()
{
    int a = 10;
    int *ptr1 = &a;
    int **ptr2 = &ptr1;
}

// ================指针和数组、函数  （指针数组、数组指针、指针函数、函数指针 都在ob里了，这里就放一段话吧）
/*
- **数组指针**：指向数组的指针。
- **指针数组**：数组的元素是指针。
- **函数指针**：指向函数的指针，用于将函数作为参数传递。
- **指针函数**：返回值是指针的函数。
*/

// ================指针和引用可以作为函数参数传递

void fun3(int *ptr);
void fun4(int &ref);

// ================空指针和野指针
// 空指针：指针变量没有指向任何内存地址，通常用NULL表示。
// 野指针：指针变量指向一个已被释放的内存地址，通常是由于程序逻辑错误引起的。

// ================ const 与 指针

const int *ptr;            // ptr是一个指向const int类型数据的指针，即ptr所指向的数据不能通过ptr被修改。
int *const ptr;            // ptr是一个const指针，即ptr本身的值（存储的地址）不能被修改。
const int *const ptr;      // ptr是一个指向const int类型数据的const指针，即ptr所指向的数据不能被修改，且ptr本身的值也不能被修改。
void func(const int *ptr); // 函数func接受一个指向const int类型数据的指针，表示函数内部不能通过该指针修改所指向的数据。
// arr是一个const数组，其元素不能被修改。ptr是一个指向const int类型数据的指针，指向数组的第一个元素。
const int arr[5] = {1, 2, 3, 4, 5};
const int *ptr = arr;
